package com.gsbelarus.gedemin.salary.fragment.statistic;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.util.Log;
import android.view.View;

import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;
import com.gsbelarus.gedemin.lib.ui.fragment.FragmentModel;
import com.gsbelarus.gedemin.salary.App;
import com.gsbelarus.gedemin.salary.R;
import com.gsbelarus.gedemin.salary.activity.StatisticDetail;
import com.gsbelarus.gedemin.salary.adapter.StatisticCardsAdapter;
import com.gsbelarus.gedemin.salary.database.RealmHelper;
import com.gsbelarus.gedemin.salary.entity.StatisticPayslip;
import com.gsbelarus.gedemin.salary.ui.AutofitRecyclerView;
import com.gsbelarus.gedemin.salary.ui.StatisticCardsDecoration;

import java.util.Calendar;
import java.util.List;

import io.realm.Realm;

public class StatisticFragment extends FragmentModel implements StatisticDatesFragment.NotifyDataChangedListener,
        StatisticCardsAdapter.OnItemClickListener {

    private Calendar firstDate;
    private Calendar secondDate;

    private StatisticCardsAdapter adapterCardsRecView;
    private RealmHelper realmHelper;

    /**
     * @return id View для отрисовки в фрагменте
     */
    @Override
    public int getViewResource() {
        return R.layout.statistic_recycler_view;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        realmHelper = new RealmHelper(Realm.getInstance(context));
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        realmHelper.getRealm().close();
    }

    @Override
    public void onCreateViewFragment(View rootView) {
        super.onCreateViewFragment(rootView);

        AutofitRecyclerView cardsRecView = (AutofitRecyclerView) rootView.findViewById(R.id.payslip_statistic_cards);
        adapterCardsRecView = new StatisticCardsAdapter(context, realmHelper);
        final GridLayoutManager manager = new GridLayoutManager(context, 1);
        manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                return (adapterCardsRecView.getItemViewType(position) == StatisticCardsAdapter.ItemTypes.HEADER.ordinal()) ?
                        manager.getSpanCount() : 1;
            }
        });
        cardsRecView.setLayoutManager(manager);
        cardsRecView.setColumnWidth(getActivity().getResources().getDimension(R.dimen.statistic_card_width));
        cardsRecView.addItemDecoration(new StatisticCardsDecoration(context, 2f));
        cardsRecView.setAdapter(adapterCardsRecView);

        adapterCardsRecView.setOnItemClickListener(this);
    }

    /**
     * Чтение данных из БД в новом потоке
     */
    @Override
    public void readDataBase() {

    }

    /**
     * Метод вызывается после чтения данных из БД или при смене ориентации экрана.
     * Может быть вызван до окончания выполнения потока для запроса данных из БД, поэтому следует проверять данные на null.
     * Служит для инициализации View данными
     *
     * @param rootView корневое View
     */
    @Override
    public void initView(View rootView) {
        if (firstDate != null) {
            List<StatisticPayslip> statisticPayslips = realmHelper.getPayslipStatistics(firstDate, secondDate);
            Calendar beforeFirstDate = (Calendar) firstDate.clone();
            beforeFirstDate.add(Calendar.MONTH, -1);
            Double startSum = realmHelper.getTotalSumWithPrepayment(beforeFirstDate);

            if (statisticPayslips != null) {
                adapterCardsRecView.setStartSum(startSum);
                adapterCardsRecView.setList(statisticPayslips);
                if (statisticPayslips.size() > 1)
                    adapterCardsRecView.showHeader(new StatisticCardsAdapter.OnHeaderClickListener() {
                        @Override
                        public void onClick(View view) {
                            Log.d("header", "onClick");
                        }
                    });
                else
                    adapterCardsRecView.hideHeader();
            }
        }
    }

    @Override
    public void onClick(StatisticPayslip item, View view, int position) {
        argumentsHelper.selectedMonth = item.getDate().get(Calendar.MONTH) + 1;
        argumentsHelper.selectedYear = item.getDate().get(Calendar.YEAR);

        Intent intent = new Intent(context, StatisticDetail.class);
        argumentsHelper.saveParams(intent);
        startActivity(intent);
    }

    @Override
    public void notifyDataChanged(Calendar firstDate, Calendar secondDate) {
        this.firstDate = firstDate;
        this.secondDate = secondDate;
        reloadFragmentData();
    }

    @Override
    public void onResume() {
        super.onResume();
        Tracker tracker = ((App) getActivity().getApplication()).getTracker(App.TrackerName.APP_TRACKER);
        tracker.setScreenName(getClass().getSimpleName());
        tracker.send(new HitBuilders.AppViewBuilder().build());
    }
}
